--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
BLESerial.cpp 3f7a6a8941e76248f5c51ad9c2917a377e631c02 (3f7a6a89) Text, 5.79 KB
T8b949e// Copyright (C) 2024, Mark Qvist
T8b949e// This program is free software: you can redistribute it and/or modify
T8b949e// it under the terms of the GNU General Public License as published by
T8b949e// the Free Software Foundation, either version 3 of the License, or
T8b949e// (at your option) any later version.
T8b949e// This program is distributed in the hope that it will be useful,
T8b949e// but WITHOUT ANY WARRANTY; without even the implied warranty of
T8b949e// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
T8b949e// GNU General Public License for more details.
T8b949e// You should have received a copy of the GNU General Public License
T8b949e// along with this program. If not, see <https://www.gnu.org/licenses/>.
Tff7b72#Tff7b72include T8b949e"Boards.h"
Tff7b72#Tff7b72if PLATFORM != PLATFORM_NRF52
Tff7b72#Tff7b72if HAS_BLE
Tff7b72#Tff7b72include T8b949e"BLESerial.h"
Tffa657uint32_t Td2a8ffbt_passkey_callbackTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffbt_passkey_notify_callbackTb4b4b4(Tffa657uint32_t Te6edf3passkeyTb4b4b4)Tb4b4b4;
Tffa657bool Td2a8ffbt_security_request_callbackTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffbt_authentication_complete_callbackTb4b4b4(Te6edf3esp_ble_auth_cmpl_t Te6edf3auth_resultTb4b4b4)Tb4b4b4;
Tffa657bool Td2a8ffbt_confirm_pin_callbackTb4b4b4(Tffa657uint32_t Te6edf3pinTb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffbt_connect_callbackTb4b4b4(Te6edf3BLEServer Tff7b72*Te6edf3serverTb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffbt_disconnect_callbackTb4b4b4(Te6edf3BLEServer Tff7b72*Te6edf3serverTb4b4b4)Tb4b4b4;
Tffa657bool Td2a8ffbt_client_authenticatedTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657uint32_t Td2a8ffBLESerial::onPassKeyRequestTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3bt_passkey_callbackTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Td2a8ffBLESerial::onPassKeyNotifyTb4b4b4(Tffa657uint32_t Te6edf3passkeyTb4b4b4) Tb4b4b4{ Te6edf3bt_passkey_notify_callbackTb4b4b4(Te6edf3passkeyTb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657bool Td2a8ffBLESerial::onSecurityRequestTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3bt_security_request_callbackTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Td2a8ffBLESerial::onAuthenticationCompleteTb4b4b4(Te6edf3esp_ble_auth_cmpl_t Te6edf3auth_resultTb4b4b4) Tb4b4b4{ Te6edf3bt_authentication_complete_callbackTb4b4b4(Te6edf3auth_resultTb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Td2a8ffBLESerial::onConnectTb4b4b4(Te6edf3BLEServer Tff7b72*Te6edf3serverTb4b4b4) Tb4b4b4{ Te6edf3bt_connect_callbackTb4b4b4(Te6edf3serverTb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Td2a8ffBLESerial::onDisconnectTb4b4b4(Te6edf3BLEServer Tff7b72*Te6edf3serverTb4b4b4) Tb4b4b4{ Te6edf3bt_disconnect_callbackTb4b4b4(Te6edf3serverTb4b4b4)Tb4b4b4; Te6edf3ble_serverTff7b72-Tff7b72>Te6edf3startAdvertisingTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657bool Td2a8ffBLESerial::onConfirmPINTb4b4b4(Tffa657uint32_t Te6edf3pinTb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3bt_confirm_pin_callbackTb4b4b4(Te6edf3pinTb4b4b4)Tb4b4b4; Tb4b4b4}Tb4b4b4;
Tffa657bool Td2a8ffBLESerial::connectedTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Te6edf3ble_serverTff7b72-Tff7b72>Te6edf3getConnectedCountTb4b4b4(Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4; Tb4b4b4}
Tffa657int Td2a8ffBLESerial::readTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657int Te6edf3result Tff7b72= Tff7b72thisTff7b72-Tff7b72>Te6edf3rx_bufferTb4b4b4.Te6edf3popTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3result Tff7b72=Tff7b72= Ta5d6ff'Ta5d6ff\nTa5d6ff'Tb4b4b4) Tb4b4b4{ Tff7b72thisTff7b72-Tff7b72>Te6edf3numAvailableLinesTff7b72-Tff7b72-Tb4b4b4; Tb4b4b4}
Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}
Tffa657size_t Td2a8ffBLESerial::readBytesTb4b4b4(Tffa657uint8_t Tff7b72*Te6edf3bufferTb4b4b4, Tffa657size_t Te6edf3bufferSizeTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3i Tff7b72< Te6edf3bufferSize Tff7b72&Tff7b72& Te6edf3availableTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3bufferTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Tb4b4b4(Tffa657uint8_tTb4b4b4)Tff7b72thisTff7b72-Tff7b72>Te6edf3rx_bufferTb4b4b4.Te6edf3popTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4; Tb4b4b4}
Tff7b72return Te6edf3iTb4b4b4;
Tb4b4b4}
Tffa657int Td2a8ffBLESerial::peekTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTff7b72-Tff7b72>Te6edf3rx_bufferTb4b4b4.Te6edf3getLengthTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tff7b72return T79c0ff-1Tb4b4b4;
Tff7b72return Tff7b72thisTff7b72-Tff7b72>Te6edf3rx_bufferTb4b4b4.Te6edf3getTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657int Td2a8ffBLESerial::availableTb4b4b4(Tb4b4b4) Tb4b4b4{ Tff7b72return Tff7b72thisTff7b72-Tff7b72>Te6edf3rx_bufferTb4b4b4.Te6edf3getLengthTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657size_t Td2a8ffBLESerial::printTb4b4b4(Tff7b72const Tffa657char Tff7b72*Te6edf3strTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ble_serverTff7b72-Tff7b72>Te6edf3getConnectedCountTb4b4b4(Tb4b4b4) Tff7b72<Tff7b72= T79c0ff0Tb4b4b4) Tff7b72return T79c0ff0Tb4b4b4;
Tffa657size_t Te6edf3written Tff7b72= T79c0ff0Tb4b4b4; Tff7b72for Tb4b4b4(Tffa657size_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3strTb4b4b4[Te6edf3iTb4b4b4] Tff7b72!Tff7b72= Ta5d6ff'Ta5d6ff\0Ta5d6ff'Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Te6edf3written Tff7b72+Tff7b72= Tff7b72thisTff7b72-Tff7b72>Te6edf3writeTb4b4b4(Te6edf3strTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4; Tb4b4b4}
Te6edf3flushTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3writtenTb4b4b4;
Tb4b4b4}
Tffa657size_t Td2a8ffBLESerial::writeTb4b4b4(Tff7b72const Tffa657uint8_t Tff7b72*Te6edf3bufferTb4b4b4, Tffa657size_t Te6edf3bufferSizeTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ble_serverTff7b72-Tff7b72>Te6edf3getConnectedCountTb4b4b4(Tb4b4b4) Tff7b72<Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{ Tff7b72return T79c0ff0Tb4b4b4; Tb4b4b4} Tff7b72else Tb4b4b4{
Tffa657size_t Te6edf3written Tff7b72= T79c0ff0Tb4b4b4; Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3bufferSizeTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Te6edf3written Tff7b72+Tff7b72= Tff7b72thisTff7b72-Tff7b72>Te6edf3writeTb4b4b4(Te6edf3bufferTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4; Tb4b4b4}
Te6edf3flushTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3writtenTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657size_t Td2a8ffBLESerial::writeTb4b4b4(Tffa657uint8_t Te6edf3byteTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3bt_client_authenticatedTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ble_serverTff7b72-Tff7b72>Te6edf3getConnectedCountTb4b4b4(Tb4b4b4) Tff7b72<Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{ Tff7b72return T79c0ff0Tb4b4b4; Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72thisTff7b72-Tff7b72>Te6edf3transmitBufferTb4b4b4[Tff7b72thisTff7b72-Tff7b72>Te6edf3transmitBufferLengthTb4b4b4] Tff7b72= Te6edf3byteTb4b4b4;
Tff7b72thisTff7b72-Tff7b72>Te6edf3transmitBufferLengthTff7b72+Tff7b72+Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTff7b72-Tff7b72>Te6edf3transmitBufferLength Tff7b72=Tff7b72= Te6edf3maxTransferSizeTb4b4b4) Tb4b4b4{ Te6edf3flushTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tff7b72return T79c0ff1Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657void Td2a8ffBLESerial::flushTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTff7b72-Tff7b72>Te6edf3transmitBufferLength Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3TxCharacteristicTff7b72-Tff7b72>Te6edf3setValueTb4b4b4(Tff7b72thisTff7b72-Tff7b72>Te6edf3transmitBufferTb4b4b4, Tff7b72thisTff7b72-Tff7b72>Te6edf3transmitBufferLengthTb4b4b4)Tb4b4b4;
Tff7b72thisTff7b72-Tff7b72>Te6edf3transmitBufferLength Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72thisTff7b72-Tff7b72>Te6edf3lastFlushTime Tff7b72= Te6edf3millisTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3TxCharacteristicTff7b72-Tff7b72>Te6edf3notifyTb4b4b4(Tffa657trueTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657void Td2a8ffBLESerial::disconnectTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ble_serverTff7b72-Tff7b72>Te6edf3getConnectedCountTb4b4b4(Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tffa657uint16_t Te6edf3conn_id Tff7b72= Te6edf3ble_serverTff7b72-Tff7b72>Te6edf3getConnIdTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// Serial.printf("Have connected: %d\n", conn_id);
Te6edf3ble_serverTff7b72-Tff7b72>Te6edf3disconnectTb4b4b4(Te6edf3conn_idTb4b4b4)Tb4b4b4;
T8b949e// Serial.println("Disconnected");
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// Serial.println("No connected");
Tb4b4b4}
Tb4b4b4}
Tffa657void Td2a8ffBLESerial::beginTb4b4b4(Tff7b72const Tffa657char Tff7b72*Te6edf3nameTb4b4b4) Tb4b4b4{
Te6edf3ConnectedDeviceCount Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3BLEDeviceTff7b72:Tff7b72:Te6edf3initTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4;
Te6edf3esp_ble_tx_power_setTb4b4b4(Te6edf3ESP_BLE_PWR_TYPE_DEFAULTTb4b4b4, Te6edf3ESP_PWR_LVL_P9Tb4b4b4)Tb4b4b4;
Te6edf3esp_ble_tx_power_setTb4b4b4(Te6edf3ESP_BLE_PWR_TYPE_ADVTb4b4b4, Te6edf3ESP_PWR_LVL_P9Tb4b4b4)Tb4b4b4;
Te6edf3esp_ble_tx_power_setTb4b4b4(Te6edf3ESP_BLE_PWR_TYPE_SCAN Tb4b4b4,Te6edf3ESP_PWR_LVL_P9Tb4b4b4)Tb4b4b4;
Te6edf3ble_server Tff7b72= Te6edf3BLEDeviceTff7b72:Tff7b72:Te6edf3createServerTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ble_serverTff7b72-Tff7b72>Te6edf3setCallbacksTb4b4b4(Tff7b72thisTb4b4b4)Tb4b4b4;
Te6edf3BLEDeviceTff7b72:Tff7b72:Te6edf3setEncryptionLevelTb4b4b4(Te6edf3ESP_BLE_SEC_ENCRYPT_MITMTb4b4b4)Tb4b4b4;
Te6edf3BLEDeviceTff7b72:Tff7b72:Te6edf3setSecurityCallbacksTb4b4b4(Tff7b72thisTb4b4b4)Tb4b4b4;
Te6edf3SetupSerialServiceTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTff7b72-Tff7b72>Te6edf3startAdvertisingTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffBLESerial::startAdvertisingTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3ble_adv Tff7b72= Te6edf3BLEDeviceTff7b72:Tff7b72:Te6edf3getAdvertisingTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ble_advTff7b72-Tff7b72>Te6edf3addServiceUUIDTb4b4b4(Te6edf3BLE_SERIAL_SERVICE_UUIDTb4b4b4)Tb4b4b4;
Te6edf3ble_advTff7b72-Tff7b72>Te6edf3setMinPreferredTb4b4b4(T79c0ff0x20Tb4b4b4)Tb4b4b4;
Te6edf3ble_advTff7b72-Tff7b72>Te6edf3setMaxPreferredTb4b4b4(T79c0ff0x40Tb4b4b4)Tb4b4b4;
Te6edf3ble_advTff7b72-Tff7b72>Te6edf3setScanResponseTb4b4b4(Tffa657trueTb4b4b4)Tb4b4b4;
Te6edf3ble_advTff7b72-Tff7b72>Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffBLESerial::stopAdvertisingTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3ble_adv Tff7b72= Te6edf3BLEDeviceTff7b72:Tff7b72:Te6edf3getAdvertisingTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ble_advTff7b72-Tff7b72>Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffBLESerial::endTb4b4b4(Tb4b4b4) Tb4b4b4{ Te6edf3BLEDeviceTff7b72:Tff7b72:Te6edf3deinitTb4b4b4(Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tffa657void Td2a8ffBLESerial::onWriteTb4b4b4(Te6edf3BLECharacteristic Tff7b72*Te6edf3characteristicTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3characteristicTff7b72-Tff7b72>Te6edf3getUUIDTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3BLE_RX_UUIDTb4b4b4) Tb4b4b4{
Tff7b72auto Te6edf3value Tff7b72= Te6edf3characteristicTff7b72-Tff7b72>Te6edf3getValueTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3valueTb4b4b4.Te6edf3lengthTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Te6edf3rx_bufferTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3valueTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4; Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tffa657void Td2a8ffBLESerial::SetupSerialServiceTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3SerialService Tff7b72= Te6edf3ble_serverTff7b72-Tff7b72>Te6edf3createServiceTb4b4b4(Te6edf3BLE_SERIAL_SERVICE_UUIDTb4b4b4)Tb4b4b4;
Te6edf3RxCharacteristic Tff7b72= Te6edf3SerialServiceTff7b72-Tff7b72>Te6edf3createCharacteristicTb4b4b4(Te6edf3BLE_RX_UUIDTb4b4b4, Te6edf3BLECharacteristicTff7b72:Tff7b72:Te6edf3PROPERTY_WRITETb4b4b4)Tb4b4b4;
Te6edf3RxCharacteristicTff7b72-Tff7b72>Te6edf3setAccessPermissionsTb4b4b4(Te6edf3ESP_GATT_PERM_WRITE_ENC_MITMTb4b4b4)Tb4b4b4;
Te6edf3RxCharacteristicTff7b72-Tff7b72>Te6edf3addDescriptorTb4b4b4(Tff7b72new Te6edf3BLE2902Tb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3RxCharacteristicTff7b72-Tff7b72>Te6edf3setWritePropertyTb4b4b4(Tffa657trueTb4b4b4)Tb4b4b4;
Te6edf3RxCharacteristicTff7b72-Tff7b72>Te6edf3setCallbacksTb4b4b4(Tff7b72thisTb4b4b4)Tb4b4b4;
Te6edf3TxCharacteristic Tff7b72= Te6edf3SerialServiceTff7b72-Tff7b72>Te6edf3createCharacteristicTb4b4b4(Te6edf3BLE_TX_UUIDTb4b4b4, Te6edf3BLECharacteristicTff7b72:Tff7b72:Te6edf3PROPERTY_NOTIFYTb4b4b4)Tb4b4b4;
Te6edf3TxCharacteristicTff7b72-Tff7b72>Te6edf3setAccessPermissionsTb4b4b4(Te6edf3ESP_GATT_PERM_READ_ENC_MITMTb4b4b4)Tb4b4b4;
Te6edf3TxCharacteristicTff7b72-Tff7b72>Te6edf3addDescriptorTb4b4b4(Tff7b72new Te6edf3BLE2902Tb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3TxCharacteristicTff7b72-Tff7b72>Te6edf3setNotifyPropertyTb4b4b4(Tffa657trueTb4b4b4)Tb4b4b4;
Te6edf3TxCharacteristicTff7b72-Tff7b72>Te6edf3setReadPropertyTb4b4b4(Tffa657trueTb4b4b4)Tb4b4b4;
Te6edf3SerialServiceTff7b72-Tff7b72>Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3BLESerialTff7b72:Tff7b72:Te6edf3BLESerialTb4b4b4(Tb4b4b4) Tb4b4b4{ Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72endif
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────